Shell学习笔记10-while循环和until循环

GO


循环语句命令常用于重复执行一条指令或一组指令,直到条件不再满足时停止,Shell脚本语言的循环语句常见的有whileuntilforselect循环语句。

while循环语句主要用来重复执行一组命令或语句,在企业实际应用中,常用于守护进程或持续运行的程序,除此之外,大多数循环都会用for循环语句。

1. 当型和直到型循环语法

1.1. while循环语句

while循环语句的基本语法为:

1
2
3
4
while <条件表达式>
do
指令...
done

提示:注意代码缩进

while循环语句会对紧跟在while命令后的条件表达式进行判断,如果该条件表达式成立,则执行while循环体里的命令或语句(即语法中do和done之间的指令),每一次执行到done时就会重新判断while条件表达式是否成立,直到条件表达式不成立时才会跳出while循环体。如果一开始条件表达式就不成立,那么程序就不会进入循环体中执行命令了。

1.2. until循环语句

until循环语句的语法为:

1
2
3
4
until <条件表达式>
do
指令...
done

until循环语句的用法与while循环语句的用法类似,区别是until会在条件表达式不成立时,进入循环执行指令;条件表达式成立时,终止循环。until的应用场景很罕见,所以了解即可,不必深究。

2. 当型和直到型循环的基本范例

首先了解一下Shell中的两个休息命令:

  • sleep 1表示休息1秒
  • usleep 1000000也表示休息1秒

下面是与while和until循环语句相关的示例。

范例1:每隔2秒输出一次系统负载情况

  • 参考答案1:每隔2秒在屏幕上输出一次负载值

    1
    2
    3
    4
    5
    6
    #!/bin/bash
    while true
    do
    uptime
    sleep 2
    done
  • 参考答案2:将负载值追加到log里,使用微秒单位

    1
    2
    3
    4
    5
    6
    #!/bin/bash
    while [ 1 ]
    do
    uptime >> /tmp/uptime.log
    usleep 2000000
    done

通过在脚本的结尾使用&符号来在后台运行脚本:filename.sh &

在实际工作中,一般会通过客户端SSH来连接服务器,因此可能就会有在脚本或命令执行期间不能终端的去求,若终端,则会前功尽弃,更要命的是会破坏系统数据。下面是防止脚本执行中断的几个可行方法:

  • 使用sh filename.sh &命令,即用&在后台运行脚本
  • 使用nohup filename.sh &命令,即使用nohup&在后台运行脚本
  • 利用screen保持会话,然后再执行命令或脚本,即使用screen保持当前会话状态。

3. 让Shell脚本在后台运行的知识

有关脚本运行的相关用法和说明见下表

用法 说明
sh *.sh & 把脚本放到后台执行(在后台运行脚本时常用的方法)
Ctrl+c 停止执行当前脚本或任务
Ctrl+z 暂停执行当前脚本或任务
bg 把当前脚本或任务放到后台执行,bg可以理解为background
fg 把当前脚本或任务放到前台执行,如果有多个任务,可以使用fg加任务编号调处对应的脚本任务,如fg 2,是指调处第二个脚本任务,fg可以理解为frontground
jobs 查看当前执行到的脚本或任务
kill 关闭执行的脚本任务,即以kill %任务编号的形式关闭脚本,这个任务编号,可以通过jobs来获得

更多有关进程管理的Linux相关命令如下:

  • killkillallpkill:杀掉进程
  • ps:查看进程
  • pstree:显示进程状态树
  • top:显示进程
  • renice:改变优先权
  • nohup:用户退出系统之后继续工作
  • pgrep:查找匹配条件的进程
  • strace:跟踪一个进程的系统调用情况
  • ltrace:跟踪进程调用库函数的情况

4. while循环按行读文件的方式总结

下面是利用while循环来按行读文件的几种常见方式:

  • 采用exec读取文件,然后进入while循环处理:

    1
    2
    3
    4
    5
    6
    exec <FILE
    sum=0
    while read line
    do
    cmd
    done
  • 使用cat读取文件内容,然后通过管道进入while循环处理:

    1
    2
    3
    4
    cat FILE_PATH | while read line
    do
    cmd
    done
  • 在while循环结尾done处理过输入重定向指定读取的文件:

    1
    2
    3
    4
    while read line
    do
    cmd
    done<FILE

范例:开发一个Shell脚本实现Linux系统命令cat读文件的基本功能。参考答案如下:

1
2
3
4
while read line
do
echo $line
done < $1

5. 小结

5.1. while循环结构及相关语句综合实践小结

  • while循环的特长是执行守护进程,以及实现我们希望循环持续执行不退出的应用,适合用于频率小于1分钟的循环处理,其它的while循环几乎都可以被for循环及定时任务crond功能所替代。
  • case语句可以用if语句来替换,而在系统启动脚本时传入少量固定规则字符串的情况下,多用case语句,其他普通判断多用if语句。
  • 一句话场景下,if语句、for语句最常用,其次是while(守护进程)、case(服务启动脚本)。

5.2. Shell脚本中各个语句的使用场景

  • 条件表达式,用于简短的条件判断及输出(文件是否存在,字符串是否为空等)
  • if取值判断,多用于不同值数量较少的情况
  • for最常用于正常的循环处理中
  • while多用于守护进程、无限循环(要加sleep和usleep控制频率)场景
  • case多用于服务启动脚本中,打印菜单可用select语句,不过很少见,一般用cat的here文档方法来替代。

OK

0%